CPP巧用正则一次性截取多段子字符串

字符串截取我想每个程序猿不管是新手还是老手都很熟悉了,像C++里的substr()方法就十分好用,但是这个方法需要知道你要截取位置的起始位置和需要截取的字符串长度,又或者需要知道截取的起始位置和停止位置。

背景

上面说的substr方法在截取不确定长度字符串和一次性截取多段子字符串时用起来不是很方便。小编就遇到这样的问题,下面来详细讲讲:

现在有一串格式固定但是长度不确定的字符串,例如:set(“mill_ed.8.f_steptools.1.st_profile”, “face”, 50.800);这样一个字符串,他的结构是有规律的,都是由“.”分隔。

如上,我需要截取标红色的部分,其他部分都是固定的,按照常规方法我是可以先用“.”将字符串分割,然后再有部分的再分别去截取。但是我嫌麻烦,于是我就想到了正则表达式,想着能不能用正则去将我需要的字符匹配出来。

实现

直接上代码吧:

先看下运行结果吧:

怎么样一次性将所有需要的子字符串全部截取出来了,是不是很方便快捷呢?(大家注意一下这里,result容器内的第一项是匹配成功的整字符串,后面的才是小括号中()匹配条件的子字符串)。

详解

接下来我们来了解一下C++正则的一些基本用法吧。我们在用C++的正则的时候需要引入regex库#include<regex>,这个库里面有哪些东西呢?

这里的函数和类型我就不讲了,主要用到regex_match方法。然后将目标字符串与你得正则表达式去匹配,得到的匹配结果全部在smatch类型的容器中。其中最终要的主要是regex正则表达式

regex pattern = regex("set\\(\".*)\\.(\\d+)\\.(.*)\\.(\\d+)\\.st_profile\",.*\"([a-z]+)\",(.*)\\).*");这里是核心,这里用到的正则知识其实都是最基本的,不是很复杂,如果有不懂得小伙伴自己去看下正则相关的知识,正则是与编程语言无关的都是通用的。大概讲一下这里用到的几个通配符的意思:(截图来源菜鸟教程)

需要特别说明的是你需要匹配出来的子字符串的表达式一定要用小括号“()”括起来,不然的话匹配结果是不会进入到smatch容器里去的,我们验证一下,我将第一个子表达式的小括号“()”去掉我们看一下结果:regex pattern = regex("set\\(\".*\\.(\\d+)\\.(.*)\\.(\\d+)\\.st_profile\",.*\"([a-z]+)\",(.*)\\).*");

运行结果是:

我们看到结果与上一次比少了mill_ed这一项。

希望对大家有帮助,如果大家以后在处理字符串有这种需求的话可以尝试一下这种方法,我个人觉得用起来是很方便快捷的。最后给大家附上源代码吧

#include <stdio.h>
#include <iostream>
#include <regex>
using namespace std;
int main()
{
    string str("set(\"mill_ed.8.f_steptools.1.st_profile\",\"face\", 50.800);");
    regex pattern = regex("set\\(\"(.*)\\.(\\d+)\\.(.*)\\.(\\d+)\\.st_profile\",.*\"([a-z]+)\",(.*)\\).*");
    smatch result ;
    bool isMatch = regex_match(str,result,pattern);
    for (int i = 0; i < result.size(); i++)
    {
        cout<<result[i]<<endl;
    }
    system("pause");
    return 0 ;
}